<?php

/**
 * \file
 * Classe `sqlQuery`.
 *
 * \since 01/10/2008
 * \author Matthieu OVIEDO <matthieu.oviedo@gmail.com>
 */

namespace pilar\Entities /* \cond */ ; /* \endcond */
{

/**
 * Base d'un objet produisant une requête SQL. Généralise la gestion des
 * clauses WHERE et LIMIT communes aux requêtes SELECT, UPDATE, DELETE
 * de SQL. Généralise également la gestion de l'entité visée par la requête.
 * Introduit une cadre formel pour la production de requêtes SQL.
 *
 * \since 01/10/2008
 * \author Matthieu OVIEDO <matthieu.oviedo@gmail.com>
 */
abstract class sqlQuery {

/**
 * Entité de la requête.
 * \since 01/10/2008
 */
public $_entity;


/**
 * \since 01/10/2008
 * Expressions de la clause WHERE de la requête.
 */
protected $_whereExp;


/**
 * \since 01/10/2008
 * Limite inférieure de lecture à utiliser pour la requête.
 */
protected $_limitOffset;


/**
 * \since 01/10/2008
 * Nombre de lignes à traiter à partir de la limite inférieure de lecture.
 */
protected $_limitLength;


/**
 * Constructeur.
 * 
 * \since 01/10/2008
 * \param $entity Entité de la requête.
 */
public function __construct($entity) {
 $this->_entity = $entity;
 
 $this->_whereExp = null;
 
 $this->_limitOffset = 0;
 $this->_limitLength = null;
}


/**
 * Spécifie quelle sera l'expression de la clause WHERE.
 * \since 28/09/2008
 * \param $exp Expression à utiliser pour la clause WHERE.
 * \return $this pour une utilisation en chaine.
 */
public function where($exp) {
 $this->_whereExp = $exp;
 return $this; 
}


/**
 * Code complet de la clause WHERE.
 *
 * \since 01/10/2008
 */
protected function whereCode() {
 if($this->_whereExp != null) {
  return " WHERE\n  ".$this->_whereExp->sqlCode()."\n";
 } else {
  return '';
 }
}


/**
 * Sélectionne les lignes du résultat à lire.
 * \since 28/09/2008
 * \param $length Nombre de lignes à lire. NULL si on veut lire jusqu'à la fin.
 * \param $offset Index de la première à lire (par défaut 0).
 * \return $this pour une utilisation en chaine.
 */
public function limit($length, $offset = 0) {
 $this->_limitOffset = $offset;
 $this->_limitLength = $length;

 return $this;
}


/**
 * Code complet de la clause LIMIT.
 *
 * \since 01/10/2008
 */
protected function limitCode() {
 if($this->_limitOffset != 0 || $this->_limitLength != null) {
  $nums = array();
  if($this->_limitOffset != 0) $nums[] = $this->_limitOffset;
  if($this->_limitLength != null) $nums[] = $this->_limitLength;
  return  ' LIMIT '.implode(',', $nums)."\n";
 } else {
  return '';
 }
}


/**
 * Génère le code SQL associé à la requête.
 * 
 * \since 01/10/2008
 * \return Code SQL de la requête.
 */
abstract public function sqlCode();


/**
 * Exécute la requête SQL.
 * 
 * \since 01/10/2008
 */
abstract public function execute();


} // Class.

} // Namespace.

?>
